package wf3.servlet;

import acceso.servlet.Conpar;
import acceso.util.Escritor;
import acceso.util.Sesion;
import acceso.util.UserSesion;
import acceso.util.WorkflowUtil;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.hibernate.exception.SQLGrammarException;
import wf.dto.ContenedorDto;
import wf.dto.geo.ConcapDto;
import wf.dto.geo.CongeoDto;
import wf.dto.geo.EntgeoDto;
import wf.dto.geo.ValentDto;
import wf.dto.geo.ValentDtoID;
import wf3.core.dao.GeovolutionDAO;
import wf3.core.dao.WorkflowDAO;
import wf3.core.manager.DAOFactory;
import wf3.geo.Concap;
import wf3.geo.Congeo;
import wf3.geo.Entgeo;
import wf3.geo.GArea;
import wf3.geo.GCirculo;
import wf3.geo.GLinea;
import wf3.geo.GPunto;
import wf3.geo.Grafo;
import wf3.geo.Punto;
import wf3.util.EmptyContenedorDto;
import wf3.util.EmptyGeocontenedorDto;

public class WorkflowGServlet extends HttpServlet {

//    private GeovolutionDAO DAO;
    @Override
    public void init() throws ServletException {
        super.init();
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        long ini = System.currentTimeMillis();
        response.setContentType("text/html;charset=ISO-8859-1");
        Escritor.escribe_debug(" Iniciando WorkflowG 2.1 =>" + request.getContextPath() + " " + request.getQueryString());
        HttpSession session = request.getSession();
        UserSesion US = (UserSesion) session.getAttribute("US");
        //-------------------------------------------------------
        CongeoDto contenedor = (CongeoDto) request.getAttribute("cnt");
        GeovolutionDAO dao = (GeovolutionDAO) DAOFactory.get_workflowgdao(US.getId_sesion());
        //-------------------------------------------------------
//        PrintWriter out = response.getWriter();
        try {
            long id_frawor = dao.getIdFrawor();
            long id_fraant = WorkflowUtil.convertir_long(request.getParameter("id_fraant"), 0L);
            int co_conpad = WorkflowUtil.convertir_entero(request.getParameter("co_conpad"), -1);

            contenedor.setCabecera(WorkflowUtil.convertir_boolean(request.getParameter("cabecera"), true));
            contenedor.setNo_item(WorkflowUtil.validar_string(request.getParameter("item"), ""));
            contenedor.setNo_path(WorkflowUtil.validar_string(request.getParameter("path"), ""));
            contenedor.setTransa(dao.getTransaIni(request.getRemoteHost(), WorkflowUtil.convertir_fecha(request.getParameter("fe_solini"), null)));

            dao.joindTransa_IdFrawor(id_frawor, id_fraant, contenedor.getCo_congeo());

//            CongeoDto geodto = dao.GET_CONGEO(contenedor.getCo_congeo());
//            if (geodto == null) {
//                throw new Exception("No hay datos para el contendor");
//            }
//            Congeo cnt = new Congeo(contenedor);
            dao.SAVE_PARAMETER(get_Parameter_startwich(request, "co_conpar"), id_frawor, contenedor.getCo_congeo());

            List<ConcapDto> concapdto = dao.GET_CONCAP(contenedor.getCo_congeo());
            for (ConcapDto dto : concapdto) {
                Concap concap = new Concap(dto);

                List<EntgeoDto> entgeos = dao.GET_ENTGEO(contenedor.getCo_congeo(), concap.getCo_concap().shortValue());
                for (EntgeoDto entgeodto : entgeos) {
                    Entgeo entgeo = new Entgeo(entgeodto);
                    try {
                        List<ValentDto> valentdtos = dao.GET_VALENT(entgeo.getCo_entgeo().intValue(), id_frawor, contenedor.getCo_congeo());
                        switch (entgeo.getTi_entgeo().charValue()) {
                            case 'P':
                                for (ValentDto valentdto : valentdtos) {
                                    Grafo grafo = new GPunto(valentdto, Character.valueOf('P'));
                                    entgeo.add_Grafos(grafo);
                                }
                                break;
                            case 'A': {
                                List puntos = new ArrayList();
                                Grafo grafo = null;
                                ValentDto valentdto1 = (ValentDto) valentdtos.get(0);
                                ValentDto firstvalent = (ValentDto) valentdtos.get(0);
                                for (int i = 1; i < valentdtos.size(); i++) {
                                    ValentDto valentdto2 = (ValentDto) valentdtos.get(i);
                                    puntos.add(new Punto(valentdto1));
                                    if (valentdto1.getId().getCo_entid1().compareTo(valentdto2.getId().getCo_entid1()) != 0) {
//                                        grafo = new GArea(new ArrayList(puntos), Character.valueOf('A'), firstvalent);
                                        grafo = new GArea(new ArrayList(puntos), 'A', valentdto1);
                                        entgeo.add_Grafos(grafo);
                                        puntos = new ArrayList();
                                    }
                                    valentdto1 = valentdto2;
                                }
                                if (puntos.size() <= 0) {
                                    break;
                                }
                                grafo = new GLinea(new ArrayList(puntos), 'A', firstvalent);
                                entgeo.add_Grafos(grafo);
                                break;
                            }
                            case 'L': {
                                System.out.println("Generando LInea");
                                List puntos = new ArrayList();
                                Grafo grafo = null;
                                ValentDto valentdto1 = (ValentDto) valentdtos.get(0);
                                ValentDto firstvalent = (ValentDto) valentdtos.get(0);
                                for (int i = 1; i < valentdtos.size(); i++) {
                                    ValentDto valentdto2 = (ValentDto) valentdtos.get(i);
                                    puntos.add(new Punto(valentdto1));

                                    if (valentdto1.getId().getCo_entid1().compareTo(valentdto2.getId().getCo_entid1()) != 0) {
                                        grafo = new GLinea(new ArrayList(puntos), 'L', firstvalent);
                                        entgeo.add_Grafos(grafo);
                                        puntos = new ArrayList();
                                        firstvalent = valentdto2;
                                    }
                                    valentdto1 = valentdto2;
                                }
                                if (puntos.size() <= 0) {
                                    break;
                                }
                                puntos.add(new Punto(valentdto1));

                                grafo = new GLinea(new ArrayList(puntos), 'L', firstvalent);
                                entgeo.add_Grafos(grafo);
                                break;
                            }
                            case 'C': {
                                for (ValentDto valentdto : valentdtos) {
                                    entgeo.add_Grafos(new GCirculo(valentdto, 'C'));
                                }
                                break;
                            }

                        }

                    } catch (Exception ep) {
                        System.out.println("Error:" + ep.getMessage());
                    }

                    concap.add_Entgeo(entgeo);
                }
                contenedor.getLs_concap().add(concap);
            }

            contenedor.setCo_conpad(co_conpad);
            session.setAttribute("c" + id_frawor, contenedor);
            DAOFactory.closedao(dao);

            if (WorkflowUtil.convertir_boolean(request.getParameter("popup"))) {
                RequestDispatcher dispatcher = request.getRequestDispatcher("/workflow2/geoconten2.jsp?id_frawor=" + id_frawor);
                dispatcher.forward(request, response);
            } else {
                if (contenedor.isCabecera()) {
                    RequestDispatcher dispatcher = request.getRequestDispatcher("/workflow2/contenedor.jsp?id_frawor=" + id_frawor);
                    dispatcher.forward(request, response);
                } else {
                    RequestDispatcher dispatcher = request.getRequestDispatcher("/workflow2/geoconten2.jsp?id_frawor=" + id_frawor);
                    dispatcher.forward(request, response);
                }
            }

        } catch (ServletException | IOException ep) {
            DAOFactory.closedao(dao);
            if (!(contenedor instanceof EmptyGeocontenedorDto)) {
//            if (true) {
                EmptyGeocontenedorDto cnt = new EmptyGeocontenedorDto();
                cnt.setCo_congeo(-1);
                cnt.getLsexc().add(ep);
                session.setAttribute("c0", cnt);
            } else {
                contenedor.getLsexc().add(ep);
                session.setAttribute("c0", contenedor);
            }
            RequestDispatcher dispatcher = request.getRequestDispatcher("/workflow2/contenedor.jsp?id_frawor=" + 0);
            dispatcher.forward(request, response);
        }
        Escritor.escribe_debug("[" + US.getId_sesion() + "] [WorkflowGServlet " + (System.currentTimeMillis() - ini) + "ms]");
    }

    public List<Conpar> get_Parameter_startwich(HttpServletRequest request, String name_start) {
        List<Conpar> lista = new ArrayList<>();
        Enumeration enumeration = request.getParameterNames();
        while (enumeration.hasMoreElements()) {
            String parametro = (String) enumeration.nextElement();
            if (parametro.startsWith(name_start)) {
                acceso.servlet.Conpar conpar = new acceso.servlet.Conpar();
//                short id = convertir_short(parametro.replaceAll(name_start + "_", ""));
                short id = WorkflowUtil.convertir_short(parametro.replaceAll(name_start + "_", ""));
                String valor = "" + request.getParameter(parametro);
                conpar.setId(id);
                conpar.setValor(valor);
                lista.add(conpar);
            }
        }
        return lista;
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Servlet WF-G2";
    }
}
